package com.bajiao.common.util.vans;

import cn.hutool.core.util.StrUtil;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;

public class RegexTool {

    //身份证前17位数字依次乘以对应的权重因子
    public static final Integer[] idCardWeight= {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
    //身份证最后一位对应的校验码
    public static final String[] idCardCheck= {"1","0","X","9","8","7","6","5","4","3","2"};

    public static final String mobileRegex = "^1[3-9]\\d{9}$";

    public static final String emailRegex = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*(\\.[a-zA-Z]{2,})$";

    //组装根据余数，对应一个指定的校验码
    public static Map<Integer,String> idCardMap = new HashMap<>();

    /**
     * @Description
     * 正则表达式验证中国大陆手机号
     * @date 2024/10/12 15:41
     * @author FanJq
     * @param number
     * @return {@link boolean}
     */
    public static boolean mobileCheck(String number) {
        if (StrUtil.isBlank(number))
             return false;
        // 正则表达式验证中国大陆手机号
        String regex = mobileRegex;
        return number.matches(regex);
    }

    /**
     * @Description
     * 正则表达式验证邮箱号
     * @date 2024/12/24 15:12
     * @author FanJq
     * @param email
     * @return {@link boolean}
    */
    public static boolean emailCheck(String email) {
        if (StrUtil.isBlank(email))
            return false;
        // 正则表达式验证邮箱号
        String regex = emailRegex;
        return email.matches(regex);
    }

    /**
     * @Description
     * 验证身份证号
     * @date 2024/10/12 15:45
     * @author FanJq
     * @param idCardNo
     * @return {@link Boolean}
    */
    public static Boolean idCardCheck(String idCardNo){
        boolean check = false;
        if (StrUtil.isBlank(idCardNo))
            return check;
        //将其转成大写有的身份证最后一位是字母
        String idCard=idCardNo.toUpperCase();

        //15位身份证转成18位
//        Integer verifyNum=0;
        if (idCardNo.length() == 15) {
            if (!(idCardNo.matches( "[0-9]{17}[0-9|x]|[0-9]{15}"))) {
                System.out.println("请输入正确格式的15位身份证号码");
                return false;
            } else {
                //15位转换为18位
                String s2 = idCardNo.substring(0, 6);
                String s3 = idCardNo.substring(6, 15);
                String changed = s2.concat("19").concat(s3);
//                char[] c_Id = changed.toCharArray();
//                for (int m=0; m < 17; m++) {
//                    verifyNum += (idCardWeight[m] * Integer.parseInt(String.valueOf(c_Id[m])));
//                }
//                int y = verifyNum % 11;
//                changed=changed.concat(idCardCheck[y]);
                idCard=changed.toUpperCase();
            }
        }


        //获取身份证最后一位进行验证
        String lastStr = idCard.substring(idCard.length() - 1);
        //获取身份证前17位
        String firstStr = idCard.substring(0,17);
        //验证身份证前17位是否为数字
        boolean isDigits = Pattern.matches("^\\d{17}", firstStr);
        if(!isDigits){
            return false;
        }
        //全局变量
        if(idCardMap.isEmpty()){
            for(int i=0;i<=10;i++){
                idCardMap.put(i,idCardCheck[i]);
            }
        }

        char[] idCardCharNumber=idCard.toCharArray();
        Integer resultSum=0;
        for(int i=0;i< idCardCharNumber.length-1;i++){
            resultSum+=Character.getNumericValue(idCardCharNumber[i])*idCardWeight[i];
        }
        //将相加的前17位数字依次乘以对应的权重因子相加，相加的结果除以11，得到余数
        Integer lastResult=resultSum%11;
        //根据余数，对应一个指定的校验码。最终得到的校验码就是身份证号码的最后一位数字。通过这个校验码，可以验证前面17位数字是否正确，从而提高身份证号码的准确性
        if(idCardMap.containsKey(lastResult)){
            check = idCardMap.get(lastResult).equals(lastStr);
        }
        return check;
    }

    public static void main(String[] args) {
        //System.out.println(mobileCheck("18621111559"));
        System.out.println(emailCheck("1347330318@gmall.com"));
    }
}
